﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;

namespace AvaProvi
{
    [Serializable]
    public class clsFraccionDeTerreno_CRN:clsEstado,IControlEstados
    {
        #region Propiedades de clase
        public string Fraccion { get; set; }
        public string MotivoCoeficiente { get; set; }
        public decimal Indiviso { get; set; }
        public double Superficie { get; set; }
        public double FactorZona { get; set; }
        public double FactorUbicacion { get; set; }
        public double FactorFrente { get; set; }
        public double FactorFondo { get; set; }
        public double FactorSuperficie { get; set; }
        public double FactorOtro { get; set; }
        //El valor del coeficiente es el obtenido en el Factor de referencia
        public double FactorDeReferencia
        {
            get
            {
                return this.FactorFondo * this.FactorFrente * this.FactorOtro * this.FactorSuperficie * this.FactorUbicacion * this.FactorZona;
            }
        }
        public double PrecioM2
        {
            get
            {
                if (this.Superficie > 0)
                    return this.Terreno.Inmueble.EnfoqueDeMercado.ValorHomologadoDeTerrenoAplicable;
                return 0;
            }
        }
        public double ValorResultante
        {
            get
            {
                return this.PrecioM2 * this.FactorDeReferencia;
            }
        }
        public double ValorParcial
        {
            get
            {
                return this.ValorResultante * this.Superficie * Convert.ToDouble(this.Indiviso);
            }
        }
        public int IDFraccion { get; set; }
        public clsTerreno_CRN Terreno { get; set; }
        #endregion

        #region Constructor
        public clsFraccionDeTerreno_CRN(clsTerreno_CRN objTerreno):base()
        {
            this.FactorFondo = 1;
            this.FactorFrente = 1;
            this.FactorOtro = 1;
            this.FactorSuperficie = 1;
            this.FactorUbicacion = 1;
            this.FactorZona = 1;
            this.Fraccion = string.Empty;
            this.Indiviso = 1;
            this.MotivoCoeficiente = string.Empty;
            this.Superficie = 0;
            this.Terreno = objTerreno;
        }
        #endregion

        #region Métodos

        public bool Guardar()
        {
            if (this.DatosValidos())
            {
                if (this.EsNuevo)
                    return CreaFraccionDeTerreno();
                else
                {
                    if (this.EsModificado)
                        return ModificaFraccionDeTerreno();
                    else
                        return EliminaFraccionDeTerreno();
                }
            }
            return false;
        }

        private bool EliminaFraccionDeTerreno()
        {
            clsFraccionDeTerreno_CD objFraccion_CD = new clsFraccionDeTerreno_CD();
            return objFraccion_CD.EliminaFraccionDeTerreno(this);
        }

        private bool ModificaFraccionDeTerreno()
        {
            clsFraccionDeTerreno_CD objFraccion_CD = new clsFraccionDeTerreno_CD();
            return objFraccion_CD.ActualizaFraccionDeTerreno(this);
        }

        private bool CreaFraccionDeTerreno()
        {
            clsFraccionDeTerreno_CD objFraccion_CD = new clsFraccionDeTerreno_CD();
            return objFraccion_CD.CreaNuevaFraccionDeTerreno(this);
        }

        public bool DatosValidos()
        {
            if ((this.Indiviso < 0) || (this.Indiviso > 1))
            {
                MessageBox.Show("El valor del indiviso debe estar entre 0 y 1",
                    "Error en Indiviso", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        public static BindingList<clsFraccionDeTerreno_CRN> RecuperaFraccionesDeTerreno(clsTerreno_CRN objTerreno)
        {
            clsFraccionDeTerreno_CD objFraccion_CD = new clsFraccionDeTerreno_CD();
            BindingList<clsFraccionDeTerreno_CRN> blFracciones = new BindingList<clsFraccionDeTerreno_CRN>();
            BindingList<dsTerreno.FracionTerrenoRow> blFraccionesRecuperadas = objFraccion_CD.RecuperaFraccionesDeTerreno(objTerreno.Inmueble.Avaluo.IdAvaluo);
            foreach (dsTerreno.FracionTerrenoRow filaTerreno in blFraccionesRecuperadas)
            {
                clsFraccionDeTerreno_CRN objFraccion = new clsFraccionDeTerreno_CRN(objTerreno);
                objFraccion.EsModificado = true;
                objFraccion.FactorFondo = filaTerreno.FactorFondo;
                objFraccion.FactorFrente = filaTerreno.FactorFrente;
                objFraccion.FactorOtro = filaTerreno.FactorOtro;
                objFraccion.FactorSuperficie = filaTerreno.FactorSuperficie;
                objFraccion.FactorUbicacion = filaTerreno.FactorUbicacion;
                objFraccion.FactorZona = filaTerreno.FactorZona;
                objFraccion.Fraccion = filaTerreno.Fraccion;
                objFraccion.IDFraccion = filaTerreno.IDFraccion;
                objFraccion.Indiviso = filaTerreno.Indiviso;
                objFraccion.MotivoCoeficiente = filaTerreno.MotivoCoeficiente;
                objFraccion.Superficie = filaTerreno.Superficie;
                blFracciones.Add(objFraccion);
            }
            return blFracciones;
            
        }

        #endregion
    }
}
